 
package cn.liuxue.lifecircle.http; 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/** 
* com Server 
* 
* @author Aina.huang E-mail: 674023920@qq.com 
* @version 创建时间：2010 Jul 14, 2010 10:45:35 AM 类说明 
*/ 
public class ServerService { 
	private static final int PORT = 9999;// 端口监听 
	private List<Socket> mList = new ArrayList<Socket>();// 存放客户端socket 
	private ServerSocket server = null; 
	private ExecutorService mExecutorService = null;// 线程池 

	public ServerService() {
		try {
			server = new ServerSocket(PORT);
			mExecutorService = Executors.newCachedThreadPool();
			System.out.println("Server Start...");
			Socket client = null;
			while(true){
				client = server.accept();
				mList.add(client);
				mExecutorService.execute(new Service(client));
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	public class Service implements Runnable {
		
		private Socket socket = null;
		private BufferedReader in = null;
		private String msg = "";
		public Service(Socket client) {
			socket = client;
			try {
				in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				msg = "user: " +  this.socket.getInetAddress() + "come total:" + mList.size();
				this.sendMsg();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		@Override
		public void run() {
			while(true) {
				try {
					if ((msg = in.readLine()) != null) {
						if (msg.equals("exit")) {
							mList.remove(socket);
							in.close();
							socket.close();
							break;
						}
					} else {
						msg = socket.getInetAddress() + " : " + msg;
						this.sendMsg();
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
		public void sendMsg() {
			System.out.println(msg);
			int num = mList.size();
			for (int i = 0; i < num;i++) {
				Socket mSocket = mList.get(i);
				PrintWriter pw = null;
				try {
					pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())), true);
					pw.println(msg);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			
		}
		
	}
	
	
} 